跳至主要内容

網路爬蟲

初探網路爬蟲


聽說上學期你們有碰過


先簡介一下什麼是網路爬蟲


試想看看有想大量下載圖片

但你又很懶


那該怎麼辦呢?


去睡覺吧!

夢裡甚麼都有

呸呸呸!!


簡單來說就是讓你當慣老闆

使用網路爬蟲來替你工作


可以做些甚麼呢?

幫你下載美女的照片、爬文、搶Black pink的票等等


基本上就是讓爬蟲偽裝成瀏覽器去爬取你要的資料

或下達指令給爬蟲執行


爬蟲之前必須知道的事

  • 會需要先認識網站架構,Ex. HTML
  • 要當個有道德的爬蟲(!?

Selenium

官網介紹

前置作業

名琮的修復環境筆記

For Linux

  1. 安裝python 環境
sudo apt install python3.9 
apt install pipenv
sudo apt-get install python3-pip

這裡順便提一下pipenv

請使用下列程式碼嘗試安裝 selenium

pip3 install pipenv
pipenv install selenium
pip install selenium

可以先確認是否安裝成功


下載Chrome Driver

Here

Chrome -> Setting -> About Chrome -> Chrome Version

記得對照版本下載

解壓縮到桌面


語法教學


環境設定

from selenium import webdriver
from selenium.webdriver.support.ui import Select,WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import requests
from bs4 import BeautifulSoup
import io
import time


起手式

PATH = " " //Chrome Driver的位置
driver = webdriver.Chrome //所需使用的瀏覽器
driver.get(" ") //Chrome Driver要開啟的網頁
Mac的部分可以把Chrome Driver加入到bin的環境變數中
/usr/local/bin

Example

Path = "/usr/local/bin/chromedriver.exe"#chromedriver path
driver = webdriver.Chrome()#open browser
driver.get("https://www.dcard.tw/f")
==>開啟Dcard首頁

必備知識


標籤種類

常用的會像是name,class,id...

普通操作

print(driver.title) //網頁名稱
search = driver.find_element(HTML標籤, "標籤名稱" )
search.clear() //清除預設文字
search.send_keys("搜尋名稱")
time.sleep(秒數) //使爬蟲停等時間
search.send_keys(Keys.RETURN) //按下Enter

Example

print(driver.title)
search = driver.find_element(By.NAME, "query" )
search.clear()
search.send_keys("比特幣")
time.sleep(3)
search.send_keys(Keys.RETURN)

==>出現有關比特幣的搜尋結果

取得文章標題

WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "atm_26_loj7t9"))
) //等到讀到指定標籤,在執行下面的程式

titles = driver.find_elements(By.CLASS_NAME, "atm_cs_1urozh")
for title in titles :
print(title.text) //迴圈


來做個好玩東西!

警告,及免責聲明

以下遊戲內容可能引起部分人們不適
若您對於性別議題 相關議題有較為強烈的主張,
請在此打住

此遊戲內容涵意

為一款政治及社會諷刺遊戲
請勿認真對待

來玩個網頁小遊戲

遊戲網站

若有雷同存屬巧合


先建構環境跟要開的網頁

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import Select,WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import requests
from bs4 import BeautifulSoup
import io

PATH = "/usr/local/bin/chromedriver.exe"
driver = webdriver.Chrome(PATH)
driver.get("https://tsj.tw/")

點擊按鈕位置

次數

blow = driver.find_element(By.ID,'click')
blow_count = driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[2]/h4[2]')
tags: 記得最外層要把"蓋成'

等等? XPath?

簡單來說就是物件在HTML中的絕對位置

若要找的東西標籤重複,就可以用來指定位置~

讀取商品按鈕

items = []
items.append(driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[4]/td[5]/button[1]'))
items.append(driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[3]/td[5]/button[1]'))
items.append(driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[2]/td[5]/button[1]'))

讀取商品價格

prices = []
prices.append(driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[4]/td[4]'))
prices.append(driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[3]/td[4]'))
prices.append(driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[2]/td[4]'))

前置點擊器

actions = ActionChains(driver)#操作滑鼠
for n in range(10):
actions.click(blow)

自動購買道具

for i in range(10000):
actions.perform() #動作執行
count = int(blow_count.text.replace("您目前擁有", "").replace("技術點", "")) #替換掉字串為空字串只留數字
for j in range(3): #跑三次去比價
price = int(prices[j].text.replace("技術點", ""))
if count >= price: #購買
upgrade_actions = ActionChains(driver)
upgrade_actions.move_to_element(items[j])
upgrade_actions.click()
upgrade_actions.perform() #動作執行
break

全部程式碼

提醒

本程式碼可能無法在部分電腦環境上面正常執行

github專案範例連結

# Action Chains 自動玩網頁小遊戲
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import Select,WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import requests
from bs4 import BeautifulSoup
import io

PATH = "/usr/local/bin/chromedriver.exe"
driver = webdriver.Chrome(PATH)
driver.get("https://tsj.tw/%22)

blow = driver.find_element(By.ID,'click')
blow_count = driver.find_element(By.XPATH, '//[@id="app"]/div[2]/div[4]/div[2]/h4[2]')

items = []
items.append(driver.find_element(By.XPATH, '//[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[4]/td[5]/button[1]'))
items.append(driver.find_element(By.XPATH, '//[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[3]/td[5]/button[1]'))
items.append(driver.find_element(By.XPATH, '//[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[2]/td[5]/button[1]'))

prices = []
prices.append(driver.find_element(By.XPATH, '//[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[4]/td[4]'))
prices.append(driver.find_element(By.XPATH, '//[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[3]/td[4]'))
prices.append(driver.find_element(By.XPATH, '//*[@id="app"]/div[2]/div[4]/div[4]/table/tbody/tr[2]/td[4]'))

actions = ActionChains(driver)

for n in range(10):
# actions.perform()
actions.click(blow)

for i in range(10000):
actions.click(blow)
actions.perform()
count = int(blow_count.text.replace("您目前擁有", "").replace("技術點", ""))
for j in range(3):
price = int(prices[j].text.replace("技術點", ""))
if count >= price:
upgrade_actions = ActionChains(driver)
upgrade_actions.move_to_element(items[j])
upgrade_actions.click()
upgrade_actions.perform()
break

不夠過癮?

Examples

學長教太爛🥲

🔥🦐(乾蝦)

期待你們能夠做出🐮🍺的機器人~~